#!/bin/bash

# get_mac_addr.sh
#
# 功能：
# 该脚本用于获取本机指定网络接口或默认网络接口的MAC地址。
# 它整合了多种方法来提取MAC地址，并对结果进行校验，确保MAC地址格式正确。
#
# 支持的检测方法包括：
#   1. ip link show：从ip命令中提取MAC地址。
#   2. ifconfig：使用ifconfig命令获取MAC地址。
#   3. cat /sys/class/net/iface/address：从系统文件中读取MAC地址。
#   4. ethtool：使用ethtool工具获取MAC地址。
#
# 使用方法：
# 直接运行脚本即可，无需参数：
#   ./get_mac_addr.sh
# 或者指定接口：
#   ./get_mac_addr.sh eth0
#
# 输出示例：
#   尝试通过多种方法获取MAC地址：
#   方法：get_mac_ip_link -> MAC地址：00:1a:2b:3c:4d:5e
#   方法：get_mac_ifconfig -> MAC地址：00:1a:2b:3c:4d:5e
#   所有方法结果一致

# 校验MAC地址格式的函数
function is_valid_mac() {
    local mac=$1
    if [[ $mac =~ ^([0-9A-Fa-f]{2}:){5}([0-9A-Fa-f]{2})$ ]]; then
        return 0  # 有效
    else
        return 1  # 无效
    fi
}

# 方法1：使用 ip link show 获取MAC地址
function get_mac_ip_link() {
    local iface=$1
    ip link show "$iface" 2>/dev/null | grep 'link/ether' | awk '{print $2}'
}

# 方法2：使用 ifconfig 获取MAC地址
function get_mac_ifconfig() {
    local iface=$1
    ifconfig "$iface" 2>/dev/null | grep -Eo '([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}'
}

# 方法3：使用 sysfs 从系统文件中读取MAC地址
function get_mac_sysfs() {
    local iface=$1
    cat "/sys/class/net/$iface/address" 2>/dev/null
}

# 方法4：使用 ethtool 获取MAC地址
function get_mac_ethtool() {
    local iface=$1
    if command -v ethtool &>/dev/null; then
        ethtool -P "$iface" 2>/dev/null | awk '{print $3}'
    fi
}

# 获取默认网络接口
function get_default_interface() {
    ip route | grep default | awk '{print $5}'
}

# 检查多个MAC地址是否一致
function check_consistency() {
    local macs=("$@")
    local first_mac="${macs[0]}"
    for mac in "${macs[@]}"; do
        if [[ "$mac" != "$first_mac" ]]; then
            echo "方法结果不一致，请手动检查："
            for i in "${!macs[@]}"; do
                echo "方法$((i+1)) -> MAC地址：${macs[i]}"
            done
            return 1
        fi
    done
    echo "所有方法结果一致：$first_mac"
}

# main 函数：测试所有方法
function main() {
    local iface=${1:-$(get_default_interface)}
    echo "尝试通过多种方法获取MAC地址："

    local methods=(get_mac_ip_link get_mac_ifconfig get_mac_sysfs get_mac_ethtool)
    local mac_results=()

    for method in "${methods[@]}"; do
        local mac=$($method "$iface")
        if is_valid_mac "$mac"; then
            echo "方法：$method -> MAC地址：$mac"
            mac_results+=("$mac")
        else
            echo "方法：$method -> 未获取到有效MAC地址"
        fi
    done

    # 检查所有获取到的MAC地址是否一致
    if [[ ${#mac_results[@]} -gt 1 ]]; then
        check_consistency "${mac_results[@]}"
    fi
}

main "$1"
